#include <iostream>
#include <optional>
#include <string>
#include <vector>
#include <functional>

// 可能没有结果的函数
std::optional<int> parse_int(const std::string& str) {
    try {
        size_t pos = 0;
        int result = std::stoi(str, &pos);
        if (pos == str.length()) {
            return result; // 解析成功返回结果
        }
    } catch (const std::exception&) {
        // 解析失败
    }
    return std::nullopt; // 表示没有有效结果
}

// 查找容器中的元素
template<typename T>
std::optional<std::reference_wrapper<const T>> find_in_vector(const std::vector<T>& vec, const T& value) {
    for (const auto& item : vec) {
        if (item == value) {
            return std::cref(item); // 返回找到的元素引用
        }
    }
    return std::nullopt; // 没找到返回空
}

// 返回optional对象的函数
std::optional<std::string> get_middle_name(bool has_middle_name) {
    if (has_middle_name) {
        return "中间名";
    }
    return std::nullopt;
}

// 使用optional作为函数参数
void greet(const std::string& first_name, 
           const std::optional<std::string>& middle_name, 
           const std::string& last_name) {
    std::cout << "  你好, " << first_name << " ";
    if (middle_name) {
        std::cout << *middle_name << " ";
    }
    std::cout << last_name << "!\n";
}

// 测试optional的值转换和方法
void test_optional_methods(const std::optional<int>& opt) {
    // 检查是否有值
    std::cout << "  包含值: " << (opt.has_value() ? "是" : "否") << '\n';
    
    // 安全访问值
    if (opt) {
        std::cout << "  值: " << *opt << '\n';
    }
    
    // 使用value_or提供默认值
    std::cout << "  value_or(0): " << opt.value_or(0) << '\n';
    
    // 尝试使用value()，如果没有值会抛出异常
    try {
        std::cout << "  通过value()访问: " << opt.value() << '\n';
    } catch (const std::bad_optional_access&) {
        std::cout << "  通过value()访问失败: 没有值\n";
    }
}

void demonstrate_optional() {
    std::cout << "  std::optional演示:\n\n";
    
    // 1. 基本用法
    std::cout << "  基本用法:\n";
    std::optional<int> empty;  // 没有值的optional
    std::optional<int> forty_two = 42;  // 初始化为42
    
    std::cout << "  empty.has_value(): " << std::boolalpha << empty.has_value() << '\n';
    std::cout << "  forty_two.has_value(): " << forty_two.has_value() << '\n';
    
    empty = 17;  // 赋值
    std::cout << "  赋值后empty: " << *empty << '\n';
    
    empty.reset();  // 清除值
    std::cout << "  重置后empty.has_value(): " << empty.has_value() << '\n';
    
    // 2. 解析整数
    std::cout << "\n  整数解析示例:\n";
    auto num1 = parse_int("42");
    auto num2 = parse_int("3.14");
    
    std::cout << "  \"42\" 解析结果: ";
    if (num1) {
        std::cout << *num1 << '\n';
    } else {
        std::cout << "解析失败\n";
    }
    
    std::cout << "  \"3.14\" 解析结果: ";
    if (num2) {
        std::cout << *num2 << '\n';
    } else {
        std::cout << "解析失败\n";
    }
    
    // 3. 中间名示例
    std::cout << "\n  中间名示例:\n";
    greet("张", get_middle_name(true), "三");
    greet("李", get_middle_name(false), "四");
    
    // 4. 在容器中查找
    std::cout << "\n  容器查找示例:\n";
    std::vector<std::string> names = {"张三", "李四", "王五"};
    
    auto found1 = find_in_vector(names, std::string("李四"));
    auto found2 = find_in_vector(names, std::string("赵六"));
    
    std::cout << "  查找\"李四\": ";
    if (found1) {
        std::cout << "找到 \"" << found1->get() << "\"\n";
    } else {
        std::cout << "未找到\n";
    }
    
    std::cout << "  查找\"赵六\": ";
    if (found2) {
        std::cout << "找到 \"" << found2->get() << "\"\n";
    } else {
        std::cout << "未找到\n";
    }
    
    // 5. 测试optional的方法
    std::cout << "\n  optional的方法:\n";
    std::cout << "  有值的optional:\n";
    test_optional_methods(42);
    
    std::cout << "  没有值的optional:\n";
    test_optional_methods(std::nullopt);
} 